﻿// 3645. 安全密码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <set>
#include <memory.h>
using namespace std;
/*
https://www.acwing.com/problem/content/3648/

网络上各类交易活动越来越普及，为了能够安安心心地上网，经常需要设置一个安全的密码。

一般来说一个比较安全的密码至少应该满足下面两个条件：

密码长度大于等于 8。
密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为：

大写字母：A,B,C...Z;
小写字母：a,b,c...z;
数字：0,1,2...9;
特殊符号：~,!,@,#,$,%,^;
给你一个密码，你的任务就是判断它是不是一个安全的密码。

输入格式
输入包含多组测试数据。

每组数据占一行，包含一个字符串表示密码。

输出格式
每组数据输出一行结果，如果是安全密码则输出 YES，否则输出 NO。

数据范围
输入字符串长度不超过 50且仅包含题目所述四类字符。
输入最多包含 100组数据。

输入样例：
a1b2c3d4
Linle@ACM
^~^@^@!%
输出样例：
NO
YES
NO
*/

set<char> a{'~', '!', '@', '#', '$', '%', '^'};

string str;

int type[10];

int main()
{
	while (cin >> str) {
		memset(type, 0, sizeof type);
		if (str.size() < 8) {
			cout << "NO" << endl;
			continue;
		}
		for (int i = 0; i < str.size(); i++) {
			if (str[i] >= 'a' && str[i] <= 'z') {
				type[1] = 1;
			}
			else if (str[i] >= 'A' && str[i] <= 'Z') {
				type[2] = 1;
			}
			else if (str[i] >= '0' && str[i] <= '9') {
				type[3] = 1;
			}
			else if (a.count(str[i]) != 0) {
				type[4] = 1;
			}
		}
		int typeSum = 0;
		for (int i = 0; i < 10; i++) {
			typeSum += type[i];
		}
		if (typeSum >= 3) {
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}


	return 0;
}

 